package org.wzh.three.jvm.oom.example;

import net.sf.cglib.proxy.Enhancer;

/**
 * @author ewanhiz
 */
public class Client {

    public static void main(String[] args) {
        /**
         * CGLIB会让生成的代理类继承被代理类,并在代理类中对代理方法进行强化处理(前置处理,后置处理等).
         * 在CGLIB底层,其实是借助了ASM这个非常强大的Java字节码生成框架.
         *
         * Enhancer是CGLIB的字节码增强器,可以很方便的对类进行拓展.
         *
         * note:
         *  如果委托类被final修饰,那么它不可被继承,即不可被代理;
         *  同样,如果委托类中存在final修饰的方法,那么该方法也不可被代理;
         *  代理类会为委托方法生成两个方法,一个是重写的sayHello方法,另一个是CGLIB$sayHello$0方法,它是直接调用父类的sayHello方法;
         *  当执行代理对象的sayHello方法时,会首先判断一下是否存在实现了MethodInterceptor接口的CGLIB$CALLBACK_0,如果存在,则将调用MethodInterceptor中的intercept方法.
         */
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(HelloService.class);
        enhancer.setCallback(new HelloMethodInterceptor());
        HelloService service = (HelloService) enhancer.create();
        service.sayHello();
    }

}
